// #include "myTcpCilient.hpp"
// int main(int arg, char *args[])
// {
//     string serverIp = args[1];
//     string serverPort = args[2];
//     int sock = socket(AF_INET, SOCK_STREAM, 0);
//     if (sock < 0)
//     {
//         cerr << "创建套接字失败：" << strerror(errno) << endl;
//         exit(SOCK_ERR);
//     }
//     struct sockaddr_in serverAddr;
//     bzero(&serverAddr, sizeof(serverAddr));
//     serverAddr.sin_family = AF_INET;
//     serverAddr.sin_port = atoi(serverPort.c_str());
//     inet_aton(serverIp.c_str(), &serverAddr.sin_addr);
//     int cnt = 5;
//     while (connect(sock, (sockaddr *)(&serverAddr), sizeof(serverAddr)) != 0)
//     {
//         printf("连接失败，正在准备重新连接，还可重新连接 %d 次\n", --cnt);
//         if (cnt <= 0)
//         {
//             break;
//         }
//     }
//     if (cnt <= 0)
//     {
//         cerr << "连接失败..." << endl;
//         exit(CONNECT_ERR);
//     }
//     while (1)
//     {
//         char buf[1024];
//         string message;
//         cout << "请输入：";
//         getline(cin, message);
//         write(sock, message.c_str(), message.size());

//         ssize_t s = read(sock, buf, sizeof(buf) - 1);
//         if (s > 0)
//         {
//             buf[s] = 0;
//             cout << "server echo>>" << buf << endl;
//         }
//         else if (0 == s)
//         {
//             cout << "服务器关闭，我也关闭！\n";
//             break;
//         }
//         else
//         {
//             cout << "读取失败：" << strerror(errno) << endl;
//             break;
//         }
//     }
//     close(sock);
// }

#include <iostream>
using namespace std;
#include <cstring>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include "Err.hpp"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

// int main(int argc, char *argv[])
// {
//     string serverip = argv[1];
//     string serverPort = argv[2];

//     // uint16_t serverport = atoi(argv[2]);
//     int sock = socket(AF_INET, SOCK_STREAM, 0);
//     if (sock < 0)
//     {
//         cerr << "socket error : " << strerror(errno) << endl;
//         exit(SOCK_ERR);
//     }
//     struct sockaddr_in server;
//     bzero(&server, sizeof(server));
//     // memset(&server, 0, sizeof(server));
//     server.sin_family = AF_INET;
//     server.sin_port = htons(atoi(serverPort.c_str()));
//     inet_aton(serverip.c_str(), &(server.sin_addr));
//     int cnt = 5;
int main(int arg, char *args[])
{
    string serverIp = args[1];
    uint16_t serverPort = atoi(args[2]);
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
    {
        cerr << "创建套接字失败：" << strerror(errno) << endl;
        exit(SOCK_ERR);
    }
    struct sockaddr_in serverAddr;
    bzero(&serverAddr, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(serverPort);
    inet_aton(serverIp.c_str(), &serverAddr.sin_addr);
    int cnt = 5;
    while (connect(sock, (struct sockaddr *)(&serverAddr), sizeof(serverAddr)) != 0)
    {
        printf("连接失败，正在准备重新连接，还可重新连接 %d 次\n", --cnt);
        if (cnt <= 0)
        {
            break;
        }
    }
    if (cnt <= 0)
    {
        cerr << "连接失败..." << endl;
        exit(CONNECT_ERR);
    }
    char buffer[1024];
    while (true)
    {
        string line;
        cout << "Enter>>> ";
        getline(cin, line);
        write(sock, line.c_str(), line.size());
        ssize_t s = read(sock, buffer, sizeof(buffer) - 1);
        if (s > 0)
        {
            buffer[s] = 0;
            cout << "server echo >>>" << buffer << endl;
        }
        else if (s == 0)
        {
            cerr << "server quit" << endl;
            break;
        }
        else
        {
            cerr << "read error: " << strerror(errno) << endl;
            break;
        }
    }
    close(sock);
    // return 0;
}